package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream  缓冲输入流  写  bos.txt
 *        BufferedOutputStream 缓冲输入流  读入
 *
 */
public class IOSAPI {

    /**
     * 缓冲输入流  :构造器   异常对象 合理传输数据 效率提高
     * 字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
     *  InputStreamReader  读取单位：字符
     *  OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
     *
     *
     * 构造器具备：添加字符集 UTF8万国码
     * new BufferedOutputStream(低级流引用，“字符集”   size:存字节数组【指定】);
     * 问题1：不能指定字符集
     *    2：不能按照字符读取
     *
     */
    @Test
    public void testBIS(){
        /**
         * 针对于缓冲输入/出流功能上的限定----传输：文本
         *
         *  字符流【转换流】---解决：缓冲输入流读取单位 为字节问题
         *        InputStreamReader  读取单位：字符
         *       OutputStreamWriter 写出单位：字符 调用字符串getBytes写出文本
         *       需求：重新写流---针对：文字 写出文本：osw.txt
         */

    }

    @Test
    public void testOSW(){
        //标准流 1.置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //创建低级流
        try {
            fos=new FileOutputStream("osw.txt");
            //不考虑效率---只传输文本---字符输出流：输出单位字符形式
            //字符流：都可以考虑在构造器第二个参数指定编码集
            osw=new OutputStreamWriter(fos,"UTF8");
            //write（） 直接写出文本【不需要文本转换为字节数组】
            osw.write("给老铁来个双击");
            osw.write("666\n");//换行：字符 char
            osw.write("2333");
        }catch (UnsupportedEncodingException e){//字符集转换
            e.printStackTrace();
        } catch (FileNotFoundException e){//文件不存在
            e.printStackTrace();
        } catch (IOException e) {//IO流异常：所有传输失败总异常
            e.printStackTrace();
        } finally {
            //关闭高级流
            try {
                if(osw!=null)
                osw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     * 字符输入流 --- 单元测试：testISR（） 读入  文本【不可以读入字符串】
     * 字符输出流 --- 单元测试：testOSW（） 写出  文本【字符串】
     * InputStreamReader  字符输入流  不可以读入文本
     *
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader  缓冲字符输入流---解决InputStreamReader 读入字节形式
     *                                   BufferedReader   读入字符形式
     * BufferedWriter
     *
     * 需求：ISR字符输入流读取 osw.txt文件 ？？
     *      ①当前代码转换为标准流IO：捕获所有异常
     *      ②读取每行文本？ readLine（） 提示：不为null代表文本写出
     *        写出：给老铁来个双击666 参考：CV复制粘贴
     *             777
     */
    @Test
    public void testISR()  {
        FileInputStream fis=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        //创建低级流
        try {
            fis=new FileInputStream("osw.txt");
            //创建高级流---转换流----字符输入流-- 目的：指定编码集---UTF8
            isr=new InputStreamReader(fis);
            //读 read（）  问题:读入数据单位：字节，而不是字符，读字符
            //                转换流---套高级流：缓冲字符输入/出流
            //创建高级流---针对转换流当中：字符输入流无法读取形式：字符的情况---缓冲字符输入流
            br=new BufferedReader(isr);
            /**
             * BufferedReader 类
             * readLine() 读入若干字符串，直到读到没有换行符为止
             */
            //接收输出字符串
            String line=null;
            //判断条件：文本中一直有内容，一直读(line=br.readLine())  一行文本
            while((line=br.readLine())!=null){
               System.out.println("打印读到字符串："+line);
           }
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(isr!=null)
                    isr.close();
                if (br!=null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 作业2：读取IOSAPI.Java文件---所有代码---写出控制台
     */
    @Test
    public void testHomeWork2()  {
        FileInputStream fis=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        //1.创建低级流---读入--找IOSAPI.java   代表路径：File.separator
        //路径：src\main\java\com\tedu\api\io\IOSAPI.java
        try {
            fis=new FileInputStream("src"+File.separator+"main" +
                    ""+File.separator+"java" +
                    ""+File.separator+"com" +
                    ""+File.separator+"tedu" +
                    ""+File.separator+"api" +
                    ""+File.separator+"io" +
                    ""+File.separator+"IOSAPI.java");
            //2.创建高级流---读入内容是文本---转换流---无法读取文本【int】
            isr=new InputStreamReader(fis);
            //3.创建高级流---缓冲输入流---读取文本
            br=new BufferedReader(isr);
            //4.创建变量:字符串类型--保存每次读取的一行文本
            String line=null;//null代表没有内容【等同于换行符】
            //5.一直读入：每行文本保存line当中，如果line不为null  一直读
            while((line=br.readLine())!=null){
                System.out.println("打印读到字符串："+line);
            }
        }catch(FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try { //6.关闭高级流
                if(isr!=null)
                    isr.close();
                if (br!=null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter------高频版本输出流【字符输出流】
     * 1.高级流是不能直接创建的----PrintWriter可以直接创建【不需要创建低级流】--封装
     * 2.封装内层所有流的特点
     * 需求：写出文件 pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //创建高级流：转换流 功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：缓冲流 功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流 低级流 输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //写出功能：print（）打印一行文本 不换行
        //        println（）打印一行文本 换行
        pw.print("你就是");
        pw.print("我的小可爱");
        pw.close();


    }
}
